package com.bsj.power.pls.web;

import cn.dev33.satoken.annotation.SaIgnore;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.bsj.power.common.config.global.JsonResult;
import com.bsj.power.common.constant.NumericalConstants;
import com.bsj.power.common.def.entity.job.WorkPersonnel;
import com.bsj.power.common.def.vo.pls.humanface.IEventSubscriptionVO;
import com.bsj.power.common.util.ExceptionUtil;
import com.bsj.power.pls.queue.service.impl.handle.QueueHumanFaceHandle;
import com.bsj.power.pls.service.HumanFaceService;
import com.hikvision.artemis.sdk.ArtemisHttpUtil;
import com.hikvision.artemis.sdk.config.ArtemisConfig;
import com.hikvision.artemis.sdk.constant.ContentType;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.util.CollectionUtils;
import org.springframework.web.bind.annotation.*;

import javax.validation.Valid;
import java.util.List;
import java.util.Map;

/**
 * @author LiJiaXin
 * @version 1.0.0
 * @description HumanFaceController
 * @time 2024/6/27 10:55
 */
@Slf4j
@RestController
@RequestMapping("/humanFace")
//@SaCheckPermission("PERSONNEL_POS_AND_FENCE")
public class HumanFaceController {

    @Value("${hiKv.host}")
    private String host;

    @Value("${hiKv.appKey}")
    private String appKey;

    @Value("${hiKv.appSecret}")
    private String appSecret;

    /**
     * url格式：https://{hostname}:{port}/artemis/{uri}。
     */
    private final String ARTEMIS_PATH = "/artemis";

    @Autowired
    private HumanFaceService humanFaceService;

    @Autowired
    private QueueHumanFaceHandle queueHumanFaceHandle;

    /**
     * 按事件类型订阅事件
     *
     * @param eventSubscriptionVO
     * @return
     */
    @SaIgnore
    @PostMapping("/eventSubscriptionByEventTypes")
    public JsonResult eventSubscriptionByEventTypes(@Valid @RequestBody IEventSubscriptionVO eventSubscriptionVO) {
        return humanFaceService.eventSubscriptionByEventTypes(eventSubscriptionVO);
    }

    /**
     * 按事件类型取消订阅
     *
     * @param eventSubscriptionVO
     * @return
     */
    @SaIgnore
    @PostMapping("/eventUnSubscriptionByEventTypes")
    public JsonResult eventUnSubscriptionByEventTypes(@RequestBody IEventSubscriptionVO eventSubscriptionVO) {
        return humanFaceService.eventUnSubscriptionByEventTypes(eventSubscriptionVO);
    }

    /**
     * 查询事件订阅信息
     *
     * @param
     * @return
     */
    @SaIgnore
    @PostMapping("/eventSubscriptionView")
    public JsonResult eventSubscriptionView() {
        return humanFaceService.eventSubscriptionView();
    }

    /**
     * 门禁人脸认证成功事件
     * 事件类型码: 196893
     *
     * @param jsonObject
     * @return
     */
    @SaIgnore
    @PostMapping("/eventFaceMatch")
    public JsonResult eventFaceMatch(@RequestBody JSONObject jsonObject) {
//        try {
////            humanFaceQueue.push(null);
//            log.info("门禁人脸认证通过事件接收到的原始数据: {}", jsonObject);
//        } catch (Exception e) {
//            log.error("humanFaceQueue写入数据失败:" + ExceptionUtil.getStackStr(e));
//        }
        return JsonResult.success();
    }


    @SaIgnore
    @PostMapping("/test")
    public JsonResult test(@RequestBody JSONObject jsonObject) {
        String idCardNo = "";
//        if (StringUtils.isNotBlank(str)) {
//            JSONObject jsonObject = JSONObject.parseObject(str);
        Integer code = jsonObject.getInteger("code");
        if (code != null && code.equals(NumericalConstants.ZERO)) {
            JSONObject data = jsonObject.getJSONObject("data");
            JSONArray jsonArray = data.getJSONArray("list");
            List<JSONObject> jsonObjects = jsonArray.toJavaList(JSONObject.class);
            //人员信息
            JSONObject personInfo = jsonObjects.get(NumericalConstants.ZERO);
            //姓名
            String personName = personInfo.getString("personName");
            //性别
            Integer gender = personInfo.getInteger("gender");
            //证件类型 111代表身份证
            Integer certificateType = personInfo.getInteger("certificateType");
            //证件号码
            String certificateNo = personInfo.getString("certificateNo");
            if (certificateType == null || certificateType != 111 || StringUtils.isBlank(certificateNo)) {
                return null;
            }
            //电话
            String phoneNo = personInfo.getString("phoneNo");
            idCardNo = certificateNo;
        }
//        }
        return JsonResult.success();
    }


    @SaIgnore
    @GetMapping("/personList")
    public JsonResult personList() {
        return JsonResult.success();
    }

//    /**
//     * 根据人员id获取人员身份证号
//     * 请求海康“根据人员唯一字段获取人员详细信息”API
//     *
//     * @param pageNo
//     * @return java.lang.String
//     * @author ljx
//     * @time 2024/9/25 11:43
//     */
//    private List<String> personList(Integer pageNo) {
//        ArtemisConfig.host = host;
//        ArtemisConfig.appKey = appKey;
//        ArtemisConfig.appSecret = appSecret;
//        // 调用接口地址
//        final String url = "/api/resource/v2/person/personList";
//        final String httpStr = "https://";
//        Map<String, String> path = Map.of(httpStr, ARTEMIS_PATH + url);
//        //根据人员唯一字段获取人员详细信息请求参数
//        JSONObject jsonBody = new JSONObject();
//        jsonBody.put("pageNo", pageNo);
//        jsonBody.put("pageSize", 10);
//
//        String body = jsonBody.toString();
//        String result = ArtemisHttpUtil.doPostStringArtemis(path, body, null, null, ContentType.CONTENT_TYPE_JSON);
//        if (StringUtils.isNotBlank(result)) {
//            JSONObject jsonObject = JSONObject.parseObject(result);
//            Integer code = jsonObject.getInteger("code");
//            if (code != null && code.equals(NumericalConstants.ZERO)) {
//                log.info("请求人员列表信息成功，请求地址：{}，请求参数{}，返回内容：{}", JSONObject.toJSONString(path), body, result);
//                JSONObject data = jsonObject.getJSONObject("data");
//                if (data == null) {
//                    return null;
//                }
//                Integer total = data.getInteger("total");
//                if (total == null || total == 0) {
//                    return null;
//                }
//                int pageNumber = total / 1000;
//                if (pageNumber % 1000 != 0) {
//                    pageNumber += 1;
//                }
//                for (int i = 1; i <= pageNumber; i++) {
//                    jsonBody.put("pageNo", pageNo);
//                    jsonBody.put("pageSize", 1000);
//                    String patam = jsonBody.toString();
//                    String res = ArtemisHttpUtil.doPostStringArtemis(path, patam, null, null, ContentType.CONTENT_TYPE_JSON);
//                    if (StringUtils.isNotBlank(res)) {
//                        JSONObject json = JSONObject.parseObject(result);
//                        Integer code2 = json.getInteger("code");
//                        if (code2 != null && code2.equals(NumericalConstants.ZERO)) {
//                            JSONObject data2 = json.getJSONObject("data");
//                            if (data2 == null) {
//                                return null;
//                            }
//
//                        }
//                    }
//
//
//                }
//                JSONArray jsonArray = data.getJSONArray("list");
//                if (CollectionUtils.isEmpty(jsonArray)) {
//                    return null;
//                }
//                List<JSONObject> jsonObjects = jsonArray.toJavaList(JSONObject.class);
//                if (CollectionUtils.isEmpty(jsonObjects)) {
//                    return null;
//                }
//                //人员信息
//                JSONObject personInfo = jsonObjects.get(NumericalConstants.ZERO);
//                //证件类型 111代表身份证
//                Integer certificateType = personInfo.getInteger("certificateType");
//                //证件号码
//                String certificateNo = personInfo.getString("certificateNo");
//                if (certificateType == null || certificateType != 111 || StringUtils.isBlank(certificateNo)) {
//                    return null;
//                }
//                //姓名
//                String personName = personInfo.getString("personName");
//                //电话
//                String phoneNo = personInfo.getString("phoneNo");
//                WorkPersonnel workPersonnel = new WorkPersonnel(personName, phoneNo, certificateNo, extEventPersonNo);
//                return workPersonnel;
//            } else {
//                log.info("请求根据人员唯一字段获取人员详细信息失败，请求地址：{}，请求参数{}，返回内容：{}", JSONObject.toJSONString(path), body, result);
//            }
//        } else {
//            break;
//            log.info("请求根据人员唯一字段获取人员详细信息失败，返回无结果，请求地址：{}，请求参数{}", JSONObject.toJSONString(path), body);
//        }
//
//        while (true) {
//            String body = jsonBody.toString();
//            String result = ArtemisHttpUtil.doPostStringArtemis(path, body, null, null, ContentType.CONTENT_TYPE_JSON);
//            if (StringUtils.isNotBlank(result)) {
//                JSONObject jsonObject = JSONObject.parseObject(result);
//                Integer code = jsonObject.getInteger("code");
//                if (code != null && code.equals(NumericalConstants.ZERO)) {
//                    log.info("请求人员列表信息成功，请求地址：{}，请求参数{}，返回内容：{}", JSONObject.toJSONString(path), body, result);
//                    JSONObject data = jsonObject.getJSONObject("data");
//                    if (data == null) {
//                        break;
//                    }
//                    Integer total = data.getInteger("total");
//                    if (total == null || total == 0) {
//                        break;
//                    }
//
//                    JSONArray jsonArray = data.getJSONArray("list");
//                    if (CollectionUtils.isEmpty(jsonArray)) {
//                        return null;
//                    }
//                    List<JSONObject> jsonObjects = jsonArray.toJavaList(JSONObject.class);
//                    if (CollectionUtils.isEmpty(jsonObjects)) {
//                        return null;
//                    }
//                    //人员信息
//                    JSONObject personInfo = jsonObjects.get(NumericalConstants.ZERO);
//                    //证件类型 111代表身份证
//                    Integer certificateType = personInfo.getInteger("certificateType");
//                    //证件号码
//                    String certificateNo = personInfo.getString("certificateNo");
//                    if (certificateType == null || certificateType != 111 || StringUtils.isBlank(certificateNo)) {
//                        return null;
//                    }
//                    //姓名
//                    String personName = personInfo.getString("personName");
//                    //电话
//                    String phoneNo = personInfo.getString("phoneNo");
//                    WorkPersonnel workPersonnel = new WorkPersonnel(personName, phoneNo, certificateNo, extEventPersonNo);
//                    return workPersonnel;
//                } else {
//                    log.info("请求根据人员唯一字段获取人员详细信息失败，请求地址：{}，请求参数{}，返回内容：{}", JSONObject.toJSONString(path), body, result);
//                }
//            } else {
//                break;
//                log.info("请求根据人员唯一字段获取人员详细信息失败，返回无结果，请求地址：{}，请求参数{}", JSONObject.toJSONString(path), body);
//            }
//        }
//
//
//        return null;
//    }

}
